import openpyxl
from datetime import datetime
import re


def generate_character_excel(text, headers=None):
    try:
        # 如果没有提供表头，使用默认表头
        if headers is None:
            headers = ['镜头编号', '镜头描述', '风格', '角色', '场景', '中文描述', 'AI 分镜词']

        # 使用正则表达式来提取镜头数据
        shot_pattern = r'镜头 (\d+)：(.*?)\n风格：(.*?)\n角色：(.*?)\n场景：(.*?)\n中文描述：(.*?)\nAI 分镜词：(.*?)\n'
        matches = re.findall(shot_pattern, text, re.DOTALL)

        # 创建 Excel 文件
        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = "镜头数据"

        # 写入表头
        ws.append(headers)

        # 处理每个镜头数据
        for match in matches:
            shot_number = match[0]
            shot_desc = match[1].strip().replace("\n", " ")
            style = match[2].strip()
            character = match[3].strip()
            scene = match[4].strip()
            chinese_desc = match[5].strip()
            ai_desc = match[6].strip()

            # 根据选择的表头创建行数据
            row_data = []
            for header in headers:
                if header == '镜头编号':
                    row_data.append(shot_number)
                elif header == '镜头描述':
                    row_data.append(shot_desc)
                elif header == '风格':
                    row_data.append(style)
                elif header == '角色':
                    row_data.append(character)
                elif header == '场景':
                    row_data.append(scene)
                elif header == '中文描述':
                    row_data.append(chinese_desc)
                elif header == 'AI 分镜词':
                    row_data.append(ai_desc)

            # 写入行数据
            ws.append(row_data)

        # 生成文件名
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        file_name = f'storyboard_{timestamp}.xlsx'

        # 保存文件
        wb.save(file_name)

        return {
            'success': True,
            'file_name': file_name,
            'message': '文件生成成功'
        }

    except Exception as e:
        return {
            'success': False,
            'error': str(e)
        }
